[#ftl strict_vars=true]
[#--
/* Copyright (c) 2008, The Visigoth Software Society
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright notices,
 *       this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name Visigoth Software Society, FreeCC, Sun Microsystems, Inc. 
 *       nor the names of any contributors may be used to endorse 
 *       or promote products derived from this software without specific prior written 
 *       permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */
 --]
/* Generated By: FreeCC 0.9.1: Do not edit. ${filename}.java */
[#if explicitPackageName?has_content]
package ${explicitPackageName};
[#elseif grammar.nodePackage?has_content]
package ${grammar.nodePackage};
[/#if]

[#if grammar.parserPackage?has_content && grammar.nodePackage != grammar.parserPackage]
import ${grammar.parserPackage}.*;
[/#if]
[#var EXTENDS = ""]
[#if grammar.options.nodeExtends?has_content]
   [#set EXTENDS = "extends " + grammar.options.nodeExtends + " "]
[/#if]
[#if grammar.options.freemarkerNodes]
import freemarker.template.*;
[/#if]   

public class SimpleNode ${EXTENDS} implements Node {
    protected Node parent;
    protected Node[] children;
    protected int id;
    protected Object value;
    
    private int beginLine, beginColumn, endLine, endColumn;
    private String inputSource;
[#var parserArg = ""]    
[#if grammar.options.nodeUsesParser]    
    protected ${grammar.parserClassName} parser;
    [#set parserArg = grammar.parserClassName + " parser, "] 
[/#if]

    public SimpleNode(${parserArg}int id) {
        this.id = id;
[#if grammar.options.nodeUsesParser]
        this.parser = parser;
[/#if]        
    }
    
[#if grammar.options.nodeFactory]
    static public SimpleNode jjtCreate(${parserArg}int id) {
  [#if grammar.options.nodeUsesParser]
        return new SimpleNode(parser, id); 
  [#else]
        return new SimpleNode(id);
  [/#if]    
    }
[/#if]
[#if grammar.options.visitor]
    [#var VISITOR_THROWS = ""]
    [#if grammar.options.visitorException?has_content]
       [#set VISITOR_THROWS = "throws " + grammar.options.visitorException + " "]
    [/#if]
    [#var VISITOR_CLASS = grammar.parserClassName + "Visitor"]
    [#var VISITOR_DATA_TYPE = grammar.options.visitorDataType]
    [#var VISITOR_RETURN_TYPE = grammar.options.visitorReturnType]
    [#if !VISITOR_DATA_TYPE?has_content][#set VISITOR_DATA_TYPE="Object"][/#if]
    [#if !VISITOR_RETURN_TYPE?has_content][#set VISITOR_RETURN_TYPE="Object"][/#if]
    /** Accept the visitor. **/
    public ${VISITOR_RETURN_TYPE} jjtAccept(${VISITOR_CLASS} visitor, ${VISITOR_DATA_TYPE} data) ${VISITOR_THROWS}{
      [#if VISITOR_RETURN_TYPE != "void"]
        return visitor.visit(this, data);
      [/#if]
    }
           
    /** Accept the visitor. **/
    public Object childrenAccept(${VISITOR_CLASS} visitor, ${VISITOR_DATA_TYPE} data) ${VISITOR_THROWS}{
       if (children != null) {
           for (int i=0; i<children.length; ++i) {
               children[i].jjtAccept(visitor, data);
           }
       }
       return data;
    }
[/#if]
 
[#if grammar.options.trackTokens]
    protected Token firstToken, lastToken;
    public Token jjtGetFirstToken() { return firstToken;}
    public void jjtSetFirstToken(Token token) { this.firstToken = token;}
    public Token jjtGetLastToken() { return lastToken;}
    public void jjtSetLastToken(Token token) { this.lastToken = token;}
[/#if]   

    public void jjtOpen() {
    }

    public void jjtClose() {
    }

    public void jjtSetParent(Node n) {
        parent = n;
    }

    public Node jjtGetParent() {
        return parent;
    }

    public void jjtAddChild(Node n, int i) {
        if (children == null) {
            children = new Node[i + 1];
        } else if (i >= children.length) {
            Node c[] = new Node[i + 1];
            System.arraycopy(children, 0, c, 0, children.length);
            children = c;
        }
        children[i] = n;
    }

    public Node jjtGetChild(int i) {
        return children[i];
    }

    public int jjtGetNumChildren() {
        return (children == null) ? 0 : children.length;
    }

    public void jjtSetValue(Object value) {
        this.value = value;
    }

    public Object jjtGetValue() {
        return value;
    }
    
    public void setInputSource(String inputSource) {
        this.inputSource = inputSource;
    }
    
    public String getInputSource() {
        return inputSource;
    }
    
    public int getBeginLine() {
        return beginLine;
    }
     
    public int getEndLine() {
        return endLine;
    }
    
    public int getBeginColumn() {
        return beginColumn;
    }
    
    public int getEndColumn() {
        return endColumn;
    }
     
    public void setBeginLine(int beginLine) {
        this.beginLine = beginLine;
    }
     
    public void setEndLine(int endLine) {
        this.endLine = endLine;
    }
     
    public void setBeginColumn(int beginColumn) {
        this.beginColumn = beginColumn;
    }
     
    public void setEndColumn(int endColumn) {
        this.endColumn = endColumn;
    }
     
[#if grammar.options.freemarkerNodes]    
    public TemplateSequenceModel getChildNodes() {
        if (children == null) return null;
        SimpleSequence seq = new SimpleSequence();
        for (Node child : children) {
            seq.add(child);
        }
        return seq;
    }
    
    public TemplateNodeModel getParentNode() {
        return this.parent;
    }
    
    public String getNodeName() {
        return ${grammar.parserClassName}Constants.jjtNodeName[id];
    }
    
    public String getNodeType() {
        return "";
    }
    
    public String getNodeNamespace() {
        return null;
    }
    
    public String getAsString() throws TemplateModelException {
        StringBuilder buf = new StringBuilder();
        if (children != null) {
	        for (Node child : children) {
	            buf.append(child.getAsString());
	            buf.append(" ");
	        }
	    }
        return buf.toString();
    }
[/#if]    
    


    /*
     * You can override these two methods in subclasses of SimpleNode to
     * customize the way the node appears when the tree is dumped. If your
     * output uses more than one line you should override toString(String),
     * otherwise overriding toString() is probably all you need to do.
     */

    public String toString() {
        return ${grammar.parserClassName}Constants.jjtNodeName[id];
    }

    public String toString(String prefix) {
        return prefix + toString();
    }

    /*
     * Override this method if you want to customize how the node dumps out its
     * children.
     */

    public void dump(String prefix) {
        System.out.println(toString(prefix));
        if (children != null) {
            for (int i = 0; i < children.length; ++i) {
                Node n = children[i];
                if (n instanceof SimpleNode) {
                    ((SimpleNode) n).dump(prefix + "  ");
                } 
                else if (n instanceof Token) {
                    System.out.print(prefix + "  ");
                    System.out.println(n);
                }
            }
        }
    }
}
